home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #3 / Amiga Plus CD - 2002 - No. 03.iso / AmiSoft / Util / Arc / Checkx.lha / CheckX / sources / StartCode.a < prev    next >
Text File  |  2002-12-30  |  1KB  |  55 lines

  1.         INCLUDE    AINCLUDE:IncDirs.i
  2.         INCLUDE    exec/libraries.i
  3.         INCLUDE    exec/tasks.i
  4.         INCLUDE    exec/memory.i
  5.         INCLUDE    lvo/exec_lib.i
  6.  
  7.         SECTION    "StartCode",CODE
  8.         XREF    @start
  9.  
  10. * Could not do that in main program, because of C language limitations
  11. *
  12. * This is not required (e.g. You can compile the main program without that
  13. * start header), but may increase stability for files with really deep
  14. * recursion (I have a file with up to 23 link levels).
  15.  
  16. STACKSIZE    EQU    10240
  17.  
  18.         MOVEA.L    4.W,A6
  19.         MOVEQ    #37,D0
  20.         CMP.W    LIB_VERSION(A6),D0 * we need OS2.0 to use StackSwap
  21.         BHI.B    start
  22.         MOVE.L    #STACKSIZE,D2
  23.         SUBA.L    A1,A1
  24.         JSR    _LVOFindTask(A6)
  25.         MOVE.L    D0,A0
  26.         MOVE.L    TC_SPUPPER(A0),D0  * calculate current size
  27.         SUB.L    TC_SPLOWER(A0),D0
  28.         CMP.L    D2,D0
  29.         BGE.B    start           * enough ? then do nothing
  30.         MOVE.L    D2,D0
  31.         MOVEQ    #MEMF_PUBLIC,D1
  32.         JSR    _LVOAllocMem(A6)   * get memory
  33.         MOVE.L    D0,D3
  34.         BEQ.B    start           * failed ? call without StackSwap
  35.         LEA    -StackSwapStruct_SIZEOF(A7),A7
  36.         MOVE.L    A7,A4
  37.         MOVE.L    D0,stk_Lower(A4)   * initialize StackSwapStruct
  38.         ADD.L    D2,D0
  39.         MOVE.L    D0,stk_Upper(A4)
  40.         MOVE.L    D0,stk_Pointer(A4)
  41.         MOVEA.L    A4,A0
  42.         JSR    _LVOStackSwap(A6)  * swap stack
  43.         JSR    @start(PC)       * call main function
  44.         MOVE.L    D0,D6
  45.         MOVEA.L    A4,A0
  46.         JSR    _LVOStackSwap(A6)  * swap stack back
  47.         LEA    StackSwapStruct_SIZEOF(A7),A7
  48.         MOVEA.L    D3,A1
  49.         MOVE.L    D2,D0
  50.         JSR    _LVOFreeMem(A6)       * free stack
  51.         MOVE.L    D6,D0           * set return code
  52.         RTS
  53. start        JMP    @start(PC)
  54.         END
  55.